﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OffInvoiceExcelAddIn.XmlMngFiles;
using System.Globalization;
using System.IO;

namespace OffInvoiceExcelAddIn
{
    public partial class FrmCompanyInformation : Form
    {
        #region "Properties"

        /// <summary>
        /// Propiedad de tipo ConfigData la cual contiene la información necesaria para rellenar los campos
        /// del formulario.
        /// Es la representación del archivo XML de configuración como un objeto .NET
        /// </summary>
        public ConfigData Configuration { get; set; }

        #endregion

        #region "Costructors"

        /// <summary>
        /// Constructor del formulario que inicializa todos los componentes gráficos.
        /// </summary>
        public FrmCompanyInformation()
        {
            InitializeComponent();
        }

        #endregion

        #region "EventHandler"

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de aceptar.
        /// Comprueba que los datos introducidos por el usuario son correctos, en caso afirmativo rellena el
        /// objeto de configuración con esos datos los cuales seran almacenados en un archivo xml para posteriores
        /// facturaes.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOk_Click(object sender, EventArgs e)
        {
            if (EsValido())
            {
                Configuration.CIF = txtCif.Text;
                Configuration.PersonType = cbxPersonType.Text;
                Configuration.PersonTypeCode = cbxPersonType.SelectedValue.ToString();
                Configuration.ResidenceType = cbxResidenceType.Text;
                Configuration.ResidenceTypeCode = cbxResidenceType.SelectedValue.ToString();
                Configuration.CompanyName = txtCompanyName.Text;
                Configuration.Name = txtName.Text;
                Configuration.FirstName = txtFirstName.Text;
                Configuration.SecondName = txtSecondName.Text;
                Configuration.Telephone = txtPhone.Text;
                Configuration.Fax = txtFax.Text;
                Configuration.Address = txtAddress.Text;
                Configuration.CP = txtCp.Text;
                Configuration.County = txtCounty.Text;
                Configuration.State = cbxState.Text;
                Configuration.Country = cbxCountry.Text;
                Configuration.CountryCode = cbxCountry.SelectedValue.ToString();
                Configuration.Email = txtMail.Text;

                try
                {
                    XmlFile.Save(Configuration, Globals.ThisAddIn.EnvironmentVariable + Paths.ConfigPath, Configuration.GetType());
                    XmlFile.Save(Configuration, System.Environment.GetEnvironmentVariable("APPDATA") + @"\config.xml", Configuration.GetType());
                }
                catch (Exception)
                {
                    ControlMessages msg = ControlMessages.getInstance();
                    MessageBox.Show(this, String.Concat(msg.getMessage(ControlMessages.Msg.ErrorSaveConfig), "\n", msg.getMessage(ControlMessages.Msg.InfoRestart)), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    return;
                }

                this.Close();


            }
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de cancelar.
        /// Cierra el formulario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al cargar el formulario.
        /// Se cargan los datos de los combobox desdes archivos de recursos y después
        /// se inicializan los campos con los datos de la propiedad Configuración, los 
        /// cuales estaban almacenados en el archivo de configuración.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmCompanyInformation_Load(object sender, EventArgs e)
        {
            LoadLanguage();
            CultureInfo cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            String language = cInfo.Name;
            LoadComboBox(Globals.ThisAddIn.EnvironmentVariable + Paths.InformationFiles + language + Paths.PersonTypePath, cbxPersonType);
            LoadComboBox(Globals.ThisAddIn.EnvironmentVariable + Paths.InformationFiles + language + Paths.ResidenceTypePath, cbxResidenceType);
            LoadComboBox(Globals.ThisAddIn.EnvironmentVariable + Paths.InformationFiles + language + Paths.StatesPath, cbxState);
            LoadComboBox(Globals.ThisAddIn.EnvironmentVariable + Paths.InformationFiles + language + Paths.CountriesPath, cbxCountry);
            txtCif.Text = Configuration.CIF;
            cbxPersonType.Text = Configuration.PersonType;
            cbxResidenceType.Text = Configuration.ResidenceType;
            txtCompanyName.Text = Configuration.CompanyName;
            txtName.Text = Configuration.Name;
            txtFirstName.Text = Configuration.FirstName;
            txtSecondName.Text = Configuration.SecondName;
            txtPhone.Text = Configuration.Telephone;
            txtFax.Text = Configuration.Fax;
            txtAddress.Text = Configuration.Address;
            txtCp.Text = Configuration.CP;
            txtCounty.Text = Configuration.County;
            cbxState.Text = Configuration.State;
            cbxCountry.Text = Configuration.Country;
            txtMail.Text = Configuration.Email;
        }

        /// <summary>
        /// Método que maneja el evento que se produce al seleccioar un valor del combo tipo de persona.
        /// Dependiendo del valor seleccionado habilita y deshabilita componentes para que el usuario rellene.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbxPersonType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbxPersonType.SelectedValue.Equals("F"))
            {
                txtCompanyName.Enabled = false;
                txtCompanyName.Text = "";
                txtName.Enabled = true;
                txtFirstName.Enabled = true;
                txtSecondName.Enabled = true;
            }
            else
            {
                txtCompanyName.Enabled = true;
                txtName.Text = "";
                txtFirstName.Text = "";
                txtSecondName.Text = "";
                txtName.Enabled = false;
                txtFirstName.Enabled = false;
                txtSecondName.Enabled = false;
            }
        }


        #endregion

        #region "Public Methods"


        /// <summary>
        /// Método que comprueba si los datos introducidos por el usuario son correctos.
        /// En caso negativo se muestra un mensaje informativo indicando aquellos datos que no son válidos.
        /// </summary>
        /// <returns>Devuelve true o false dependiendo de si los datos son correctos o no</returns>
        public bool EsValido()
        {
            ControlMessages cmsg = ControlMessages.getInstance();
            string msg = String.Concat(cmsg.getMessage(ControlMessages.Msg.InfoCorrectFields), "\n\n");
            bool correcto = true;


            if (!InvoiceValidations.validarCif(txtCif.Text, cbxCountry.SelectedValue.ToString()))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoCIF), "\n");
                correcto = false;
            }
            else
            {
                if (txtCif.Text.Length == 9)
                {
                    string country2 = InvoiceValidations.ConvertToString(InvoiceValidations.convertToCountryType(cbxCountry.SelectedValue.ToString()));
                    txtCif.Text = string.Concat(country2, txtCif.Text);
                }
            }
            if (string.IsNullOrEmpty(cbxPersonType.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoTypePerson), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(cbxResidenceType.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoTypeResidence), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(txtCompanyName.Text) && cbxPersonType.SelectedValue.ToString().Equals("J"))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoCompanyName), "\n");
                correcto = false;
            }

            if (string.IsNullOrEmpty(txtName.Text) && cbxPersonType.SelectedValue.ToString().Equals("F"))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoName), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(txtFirstName.Text) && cbxPersonType.SelectedValue.ToString().Equals("F"))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoFirstName), "\n");
                correcto = false;
            }

            if (string.IsNullOrEmpty(txtPhone.Text) || (!InvoiceValidations.ValidarTelefono(txtPhone.Text)))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoTelephone), "\n");
                correcto = false;
            }
            if (!string.IsNullOrEmpty(txtFax.Text) && (!InvoiceValidations.ValidarTelefono(txtFax.Text)))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoFax), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(txtAddress.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoAddress), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(txtCp.Text) || (!InvoiceValidations.ValidarCP(txtCp.Text)))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoCP), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(txtCounty.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoCounty), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(cbxState.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoState), "\n");
                correcto = false;
            }
            if (string.IsNullOrEmpty(cbxState.Text))
            {
                msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoCountry), "\n");
                correcto = false;
            }
            if (!string.IsNullOrEmpty(txtMail.Text))
            {
                if (!InvoiceValidations.ValidarEmail(txtMail.Text))
                {
                    msg = string.Concat(msg, cmsg.getMessage(ControlMessages.Msg.InfoMail), "\n");
                    correcto = false;
                }
            }
            if (correcto)
            {
                return true;
            }
            MessageBox.Show(this, msg, cmsg.getMessage(ControlMessages.Msg.CaptionCompanyInformation), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            return false;
        }



        /// <summary>
        /// Método que se encarga de cargar un combobox a partir de un string con los datos.
        /// </summary>
        /// <param name="path">String que contiene el path del archivo con los valores que se van a cargar en el combo.</param>
        /// <param name="cbx">Combobox que se desea cargar</param>
        public void LoadComboBox(string path, ComboBox cbx)
        {
            try
            {
                string names2 = ReadFile(path);
                string names = names2.Replace("\r\n", "\t").Trim();
                names = names.Replace(",", "\t").Trim();
                string[] data = names.Split('\t');
                DataTable table = new DataTable();
                DataColumn cName = new DataColumn("Name");
                DataColumn cValue = new DataColumn("Value");
                table.Columns.Add(cName);
                table.Columns.Add(cValue);
                for (int i = 0; i < data.Length; i++)
                {
                    table.Rows.Add(data[i], data[i + 1]);
                    i++;
                }
                cbx.DataSource = table;
                cbx.DisplayMember = "Name";
                cbx.ValueMember = "Value";
            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadFile), msg.getMessage(ControlMessages.Msg.CaptionCompanyInformation), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }


        /// <summary>
        /// Método que carga el archivo de idioma y establece los textos de los controles
        /// en el idioma que corresponde.
        /// </summary>
        public void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                this.Text = labels.getLabels(this.Name);
                gbxCompany.Text = labels.getLabels(gbxCompany.Name);
                gbxDireccion.Text = labels.getLabels(gbxDireccion.Name);
                lbCif.Text = labels.getLabels(lbCif.Name);
                lbCompanyName.Text = labels.getLabels(lbCompanyName.Name);
                lbName.Text = labels.getLabels(lbName.Name);
                lbFirstName.Text = labels.getLabels(lbFirstName.Name);
                lbSecondName.Text = labels.getLabels(lbSecondName.Name);
                lbCountry.Text = labels.getLabels(lbCountry.Name);
                lbCounty.Text = labels.getLabels(lbCounty.Name);
                lbCp.Text = labels.getLabels(lbCp.Name);
                lbFax.Text = labels.getLabels(lbFax.Name);
                lbPersonType.Text = labels.getLabels(lbPersonType.Name);
                lbPhone.Text = labels.getLabels(lbPhone.Name);
                lbResidenceType.Text = labels.getLabels(lbResidenceType.Name);
                lbAddress.Text = labels.getLabels(lbAddress.Name);
                lbState.Text = labels.getLabels(lbState.Name);
                lbMail.Text = labels.getLabels(lbMail.Name);
                lbAddress.Text = labels.getLabels(lbAddress.Name);
            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionCompanyInformation), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Método que devuelve una cádena con los datos almacenados en el archivo especificado en 
        /// el path que recibe por parámetro.
        /// </summary>
        /// <param name="path">Ruta del archivo que vamos a leer</param>
        /// <returns>Un string con los datos en forma de cadena</returns>
        public string ReadFile(string path)
        {
            using (StreamReader sr = new StreamReader(path, Encoding.Default))
            {
                return sr.ReadToEnd();
            }
        }

        #endregion

        private void gbxCompany_Enter(object sender, EventArgs e)
        {

        }

        private void txtCif_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
